//
//  CalculatorButtonItem.swift
//  Calculator
//
//  Created by uu on 2020/8/21.
//  Copyright © 2020 UU. All rights reserved.
//

import Foundation
import UIKit

enum CalculatorButtonItem {
    
    enum Op: String {
        case plus = "+"
        case minus = "-"
        case divide = "÷"
        case multiply = "x"
        case equal = "="
    }
    
    enum Command: String {
        case clear = "AC"
        case flip = "+/-"
        case percent = "%"
    }
    
    case digit(Int)         // 数字
    case dot                // 小数点
    case op(Op)             // 操作符
    case command(Command)   // 命令
}

extension CalculatorButtonItem {
    var title: String {
        switch self {
        case .digit(let value): return String(value)
        case .dot: return "."
        case .op(let op): return op.rawValue
        case .command(let command): return command.rawValue
        }
    }
    
    // 需要导入 UIKit框架 才能使用 CGSize
    var size: CGSize {
        // 对于最后一行的按键 0，我们希望它占有两个按钮外加一个单位间距的宽度。在 CalculatorButtonItem 中，更改 extension 里的 size 属性就可以做到这一点：
        if case .digit(let value) = self, value == 0 {
            return CGSize(width: 88 * 2 + 8, height: 88)
        }
        return CGSize(width: 88, height: 88)
    }
    
    var backgroundColorName: String {
        switch self {
        case .digit, .dot: return "digitBackground"
        case .op: return "operatorBackground"
        case .command: return "commandBackground"
        }
    }
}

extension CalculatorButtonItem: Hashable {}

/**
 严格来说，可能将上面的 extension 提取出来，遵照 MVVM 的架构模式将它定义成一个新的 View Model 类型会更好。但是对于 CalculatorButton 来说，并不存在数据变化和 UI 同步的问题，所以在这里为了简洁，我们直接把外观也定义在了同一个类型里。
 */
